<?php

/**
 * Controller base para servir de herança para outros controllers. Nesse
 * controller serão criados métodos comuns a toda aplicação
 *
 * @author Igor Rocha <igortice@gmail.com>
 * @copyright Copyright (c) 2011, Igor Rocha
 */
abstract class BaseController extends Zend_Controller_Action
{

    /**
     * Método para ser inicializado antes de qualquer ação
     *
     * @return void
     */
    public function init()
    {
        $this->_setUserForViewHelper();
        $this->_setSystemForViewHelper();
        $this->_setMessageForViewHelper();

        parent::init();
    }

    /**
     * Alias para pegar nome do controller
     *
     * @return string
     */
    public function getController()
    {
        return $this->getRequest()->getParam('controller');
    }

    /**
     * Alias para pegar nomde da action
     *
     * @return string
     */
    public function getAction()
    {
        return $this->getRequest()->getParam('action');
    }

    /**
     * Método para tratar o recebimento de um post
     *
     * @param string $value
     * @return string
     */
    public function getPostTrimTags($value)
    {
        if (isset($value)) {
            $filterChain = new Zend_Filter();
            $filterChain
                ->addFilter(new Zend_Filter_StripTags())
                ->addFilter(new Zend_Filter_StringTrim());

            return $filterChain->filter($this->_request->getParam($value));
        }

        return false;
    }

    /**
     * Método para nao renderizar para uma action e para desabilitar layout
     *
     * @return void
     */
    public function ajaxNoRender()
    {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
    }

    /**
     * Método para verificar se uma requisicao é do tipo post e ajax
     *
     * @return boolean
     */
    public function isPostAjax()
    {
        return $this->_request->isPost() && $this->_request->isXmlHttpRequest() ? true : false;
    }

    /**
     * Método para retorna o nome do sistema no application.ini
     *
     * @return string
     */
    public function getNameSystem()
    {
        return Zend_Registry::get('nomesistema');
    }

    /**
     * Método para retorna a versao do sistema no application.ini
     *
     * @return string
     */
    public function getVersionSystem()
    {
        return Zend_Registry::get('versaosistema');
    }

    /**
     * Médoto para obter url do alfresco passada no application.ini
     *
     * @return string
     */
    public function getUrlAlfresco()
    {
        return Zend_Registry::get('urlalfresco') . '/service';
    }

    /**
     * Método para obter array com dados do usuario
     *
     * @return array
     */
    public function getIdentity()
    {
        $auth = Zend_Auth::getInstance()->getIdentity();
        return $auth['user'];
    }

    /**
     * Método para obter ticket do usuário logado
     *
     * @return string
     */
    public function getTicket()
    {
        $auth = Zend_Auth::getInstance()->getIdentity();
        return $auth['ticket'];
    }

    /**
     * Método para retornar a base da url do projeto
     *
     * @return string
     */
    public function baseUrl()
    {
        $base = new Zend_View_Helper_BaseUrl();
        return $base->baseUrl();
    }

    /**
     * Método para redirecionameto para /login
     *
     * @return void
     */
    public function redirectLogin()
    {
        return $this->_helper->redirector->gotoUrl($this->baseUrl() . '/login');
    }

    /**
     * Método para redirecionamento para /home/index
     *
     * @return void
     */
    public function redirectHome()
    {
        return $this->_redirect(array('action' => 'home', 'controller' => 'index'));
    }

    /**
     * Método para configurar a mensagem do flash message para ser passada para view. Este
     * médoto se comunica diretamente com o helper Message.php
     *
     * @param string $texto
     * @param string $tipo
     * @return void
     */
    public function setMessageForTheView($texto, $tipo = 'notice')
    {
        $this->view->message()->setTexto($texto);
        $this->view->message()->setTipo($tipo);
    }

    /**
     * Método para configurar uma mensagem normal para o flash message. Este método fica
     * esperando um redirecionamento para sua visualização.
     *
     * @param string $texto
     * @return void
     */
    public function setMessage($texto)
    {
        $this->_helper->flashMessenger($texto);
    }

    /**
     * Método para configurar uma mensagem de sucesso para o flash message. Este método fica
     * esperando um redirecionamento para sua visualização.
     *
     * @param string $texto
     * @return void
     */
    public function setSuccessMessage($texto)
    {
        $this->_helper->flashMessenger(array('success' => $texto));
    }

    /**
     * Método para configurar uma mensagem de erro para o flash message. Este método fica
     * esperando um redirecionamento para sua visualização.
     *
     * @param string $texto
     * @return void
     */
    public function setErrorMessage($texto)
    {
        $this->_helper->flashMessenger(array('error' => $texto));
    }

    /**
     * Método para tratar as mensagens do flash message
     *
     * @return void
     */
    private function _setMessageForViewHelper()
    {
        if ($this->_helper->flashMessenger->getMessages()) {
            $messages = $this->_helper->flashMessenger->getMessages();
            $message = $messages[0];
            $type = key($message);
            $this->setMessageForTheView($message[$type], $type);
        }
    }

    /**
     * Método para se conectar diretamente com o View Helper User.php
     *
     * @return void
     */
    private function _setUserForViewHelper()
    {
        $this->view->user()->setUser($this->getIdentity());
    }

    /**
     * Método para se conectar diretamente com o View Helper System.php.
     *
     * @return void
     */
    private function _setSystemForViewHelper()
    {
        $this->view->system()->setName($this->getNameSystem());
        $this->view->system()->setVersion($this->getVersionSystem());
    }

}
